home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / datatypes / wavdt / source / fastconvert.asm < prev    next >
Assembly Source File  |  1996-04-07  |  3KB  |  130 lines

  1. ******************************************************************************
  2. *
  3. * WAV Datatype, based on the sourcecode found in OS3.1 Native Developer Kit
  4. *
  5. * Written by David N.Junod and Christian Buchner
  6. *
  7. ******************************************************************************
  8. * fastconvert.asm
  9.  
  10.         SECTION Code
  11.  
  12.  
  13. ; 8 bit unsigned MONO -> 8 bit signed MONO conversion
  14. ; ===================================================
  15.  
  16.         ; a0=source
  17.         ; a1=destination
  18.         ; d0=destlength
  19.         ;
  20.  
  21.         XDEF _ConvertMono8
  22.  
  23. _ConvertMono8    move.l    d2,-(sp)    ; save registers
  24.  
  25.         move.l    #$80808080,d2    ; keep EOR value in d2 (faster)
  26.  
  27.         move.l    d0,-(sp)    ; save len for later use
  28.  
  29.         ; loop for len/4
  30.  
  31.         lsr.l    #2,d0        ; divide length by 4
  32.         bra.s    loopentrym8    ; enter loop
  33. outerloopm8    swap    d0
  34.  
  35. innerloopm8    move.l    (a0)+,d1    ; get LONGWORD
  36.         eor.l    d2,d1        ; convert sign bits
  37.         move.l    d1,(a1)+    ; put LONGWORD
  38.  
  39. loopentrym8    dbra    d0,innerloopm8    ; loop length
  40.         swap    d0
  41.         dbra    d0,outerloopm8
  42.  
  43.         ; loop for len MOD 4
  44.  
  45.         move.l    (sp)+,d0    ; get len from stack
  46.         and.l    #3,d0        ; calc len MOD 4
  47.         bra.s    restentrym8    ; enter loop
  48.  
  49. restloopm8    move.b    (a0)+,d1    ; get BYTE
  50.         eor.b    d2,d1        ; convert sign bit
  51.         move.b    d1,(a1)+    ; put BYTE
  52.  
  53. restentrym8    dbra    d0,restloopm8
  54.  
  55.         move.l    (sp)+,d2    ; restore registers
  56.         rts
  57.  
  58.  
  59. ; 8 bit unsigned STEREO -> 8 bit signed MONO conversion
  60. ; =====================================================
  61.     
  62.         XDEF _ConvertStereo8
  63.  
  64. _ConvertStereo8    move.l    d2,-(sp)    ; save registers
  65.  
  66.         bra.s    loopentrys8    ; enter loop
  67. outerloops8    swap    d0
  68.  
  69. innerloops8    move.b    (a0)+,d1    ; get LEFT UBYTE
  70.         lsr.b    #1,d1        ; halve falue
  71.         move.b    (a0)+,d2    ; get RIGHT UBYTE
  72.         lsr.b    #1,d2        ; halve value
  73.         add.b    d2,d1        ; sum up values
  74.         eor.b    #$80,d1        ; convert sign bit
  75.         move.b    d1,(a1)+    ; put BYTE
  76.  
  77. loopentrys8    dbra    d0,innerloops8    ; loop length
  78.         swap    d0
  79.         dbra    d0,outerloops8
  80.  
  81.         move.l    (sp)+,d2    ; restore registers
  82.         rts
  83.  
  84.  
  85. ; 16 bit unsigned MONO -> 8 bit signed MONO conversion
  86. ; ====================================================
  87.     
  88.         XDEF _ConvertMono16
  89.  
  90. _ConvertMono16    bra.s    loopentrym16    ; enter loop
  91. outerloopm16    swap    d0
  92.  
  93. innerloopm16    move.w    (a0)+,d1    ; get WORD
  94.         move.b    d1,(a1)+    ; put BYTE
  95.  
  96. loopentrym16    dbra    d0,innerloopm16    ; loop length
  97.         swap    d0
  98.         dbra    d0,outerloopm16
  99.         rts
  100.     
  101.  
  102. ; 16 bit unsigned STEREO -> 8 bit signed MONO conversion
  103. ; ======================================================
  104.     
  105.         XDEF _ConvertStereo16
  106.  
  107. _ConvertStereo16
  108.         move.l    d2,-(sp)    ; save registers
  109.  
  110.         bra.s    loopentrys16    ; enter loop
  111. outerloops16    swap    d0
  112.  
  113. innerloops16    move.w    (a0)+,d1    ; get left WORD
  114.         move.w    (a0)+,d2    ; get right WORD
  115.         asr.b    #1,d1        ; halve MSB values
  116.         asr.b    #1,d2        ; (Intel format -> LowBytes!)
  117.         add.b    d2,d1        ; sum up values
  118.         move.b    d1,(a1)+    ; put BYTE
  119.  
  120. loopentrys16    dbra    d0,innerloops16    ; loop length
  121.         swap    d0
  122.         dbra    d0,outerloops16
  123.  
  124.         move.l    (sp)+,d2    ; restore registers
  125.         rts
  126.     
  127.  
  128.  
  129.         END
  130.